package cn.wolfcode.wolf2w.service.impl;

import cn.wolfcode.wolf2w.domain.UserInfo;
import cn.wolfcode.wolf2w.cache.service.IUserInfoRedisService;
import cn.wolfcode.wolf2w.exception.LogicException;
import cn.wolfcode.wolf2w.repository.UserInfoRepository;
import cn.wolfcode.wolf2w.service.IUserInfoService;
import cn.wolfcode.wolf2w.util.AssertUtil;
import cn.wolfcode.wolf2w.util.Consts;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;


import java.util.List;
import java.util.UUID;
import java.util.regex.Pattern;

@Service
//@Transactional mongodb事务
public class UserInfoServiceImpl implements IUserInfoService{
    @Autowired
    private IUserInfoRedisService userInfoRedisService;

    @Autowired
    private UserInfoRepository userInfoRepository;

    @Override
    public void save(UserInfo userInfo) {
        userInfo.setId(null);
        userInfoRepository.save(userInfo);

    }

    @Override
    public void delete(String id) {
        userInfoRepository.deleteById(id);
    }

    @Override
    public void update(UserInfo userInfo) {
        userInfoRepository.save(userInfo);
    }

    @Override
    public UserInfo get(String id) {
        // orElse的作用 : 通过findById()方法查询数据库返回值是一个Optional类型,
        // 加上orElse就是如果findById()方法查到有值,返回值.当Optional对象里面的值为空的时候，返回一个默认的值null。
       return userInfoRepository.findById(id).orElse(null);
    }

    @Override
    public List<UserInfo> list() {
        return userInfoRepository.findAll();
    }

    @Override
    public List<UserInfo> queryForList() {

        return userInfoRepository.findAll();
    }

    @Override
    public boolean checkPhone(String phone) {
        // 判断手机号是否存在
        UserInfo userInfo = userInfoRepository.findByPhone(phone);

        // 返回boolean值给控制器
        return userInfo !=null;
    }

    // 发送短信验证
    @Override
    public void sendVerifyCode(String phone, String smsUrl, String smsKey) {
        // 1.创建验证码,编辑短信
        //使用uuid生成4位验证码  replaceAll( )替换方法  UUid生成的随机数回带上 "-"
        String verifyCode = UUID.randomUUID().toString().replaceAll("-", "").substring(0, 4);

        // 模拟发送短信
        StringBuilder sb = new StringBuilder(80);
        sb.append("本次验证码是: ").append(verifyCode).append(" ,有效时间为").
                append(Consts.VERIFY_CODE_VAI_TIME).append( " 分钟");
        // 打印出短信验证码效果
        System.out.println(sb.toString());

        // 短信发送模板
        // Url:https://way.jd.com/chuangxin/dxjk?mobile=13568813957&content=【创信】你的验证码是：5873，3分钟内有效！&appkey=807fc586074f14d5b690dfd80c62518e

        /* String url = "https://way.jd.com/chuangxin/dxjk?" +
                    "mobile="+phone+"&" +
                    "content="+sb.toString()+"&" +
                    "appkey=807fc586074f14d5b690dfd80c62518e";*/

        /*// 2.真实发送短信: 使用java代码发送http请求
        RestTemplate restTemplate = new RestTemplate();
        // 第一个参数:发送短信的接口路径 第二个参数:响应的数据类型 第三个参数:手机号码
        // 第四个参数:短信内容 第五个参数: 发送短信的凭证
        String data = restTemplate.getForObject(smsUrl,String.class,phone,"【创信】"+ sb.toString(),smsKey);

        System.out.println(data);
        // 判断forObject对象是否包含有success字段
        if (!data.contains("Success")){
            throw new LogicException("短信发送失败");
        }*/

        // 3.将验证码缓存到redis中
        userInfoRedisService.sendVerifyCode(phone,verifyCode);
    }


    @Override
    public void regist(String nickname, String password, String rpassword, String verifyCode, String phone) {
        // 判断用户输入的信息是否为空
        AssertUtil.hasLength(nickname,"昵称不能为空");
        AssertUtil.hasLength(password,"密码不能为空");
        AssertUtil.hasLength(rpassword,"密码不能为空");
        AssertUtil.hasLength(verifyCode,"验证码不能为空");
        AssertUtil.hasLength(phone,"手机号码不能为空");
        System.out.println(phone);

        // 对比两次输入的密码是否一致
        AssertUtil.isEquals(password,rpassword,"再次输入密码不一致");

        //判断手机号码是否符合格式
        // 使用正则表达式
        if (!(Pattern.matches("^1[3-9]\\d{9}", phone))) {
            throw new LogicException("您输入的手机格式不正确");
        }

        //判断手机号码是否唯一
        if (this.checkPhone(phone)){
            throw new LogicException("该手机号已经被注册");
        }

        // 判断验证码是否正确
        String code = userInfoRedisService.getVerifyCode(phone);
        if (code == null || !code.equalsIgnoreCase(verifyCode)){
            throw new  LogicException("验证码失效或错误");
        }

        // 注册
        UserInfo userInfo = new UserInfo();
        userInfo.setInfo("");
        userInfo.setCity("");
        userInfo.setEmail("");
        userInfo.setHeadImgUrl("/images/default.jpg");
        userInfo.setLevel(1);
        userInfo.setPassword(password);
        userInfo.setPhone(phone);
        userInfo.setNickname(nickname);
        userInfo.setState(UserInfo.STATE_NORMAL);

        // 保存到数据库中
        userInfoRepository.save(userInfo);
    }

    @Override
    public UserInfo login(String username, String password) {

        UserInfo user = userInfoRepository.findByPhone(username);
        // 判断登录用户是否存在
        if (user == null|| !user.getPassword().equals(password)){
            throw new LogicException("账号密码错误");
        }
        return user;
    }

    @Override
    public List<UserInfo> queryByDestName(String keyword) {
        // 通过关键字查询用户
        List<UserInfo> list = userInfoRepository.findByCity(keyword);
        return list;
    }
}
